02 - Wprowadzenie do OpenCV

Przetwarzanie i Analiza Obrazów

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 2: Wprowadzenie do OpenCV

Powrót do spisu treści ćwiczeń laboratoryjnych

W tym ćwiczeniu:

1. Cel ćwiczenia

Celem ćwiczenia jest zapoznanie się z podstawowym interfejsem OpenCV w Pythonie oraz przygotowanie prostych, interaktywnych narzędzi do pracy z obrazem.

2. Wstęp teoretyczny

Przed przejściem do zadań przeczytaj krótkie informacje poniżej i uruchom wskazany przykład.

2.1. Podstawy OpenCV w Pythonie

OpenCV to biblioteka do przetwarzania obrazów i wideo. W Pythonie korzystamy z modułu cv2.

Dokumentacja: https://docs.opencv.org/5.x/d6/d00/tutorial_py_root.html

2.2. Wczytywanie, wyświetlanie i zapis obrazów

Najważniejsze funkcje:

Uwaga:
By obraz się wyświetlił, zawsze po cv2.imshow(...) musi nastąpić cv2.waitKey(...), który pozwala na odświeżenie okna i obsługę zdarzeń.

Dokumentacja: https://docs.opencv.org/5.x/d4/da8/group__imgcodecs.html

2.3. Zdarzenia myszy, klawiatura i suwaki

W OpenCV można budować proste interaktywne aplikacje:

Dokumentacja:

2.3.1. Obsługa zdarzeń myszy - przykład

import cv2
import numpy as np

def on_mouse(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f'Kliknięto lewym przyciskiem: ({x}, {y})')
    elif event == cv2.EVENT_RBUTTONDOWN:
        print(f'Kliknięto prawym przyciskiem: ({x}, {y})')

img = np.zeros((300, 512, 3), dtype=np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)

while True:
    cv2.imshow('image', img)
    if cv2.waitKey(10) == 27:  # ESC
        break
cv2.destroyAllWindows()

2.3.2. Obsługa klawiatury - przykład

import cv2
import numpy as np

img = np.zeros((300, 512, 3), dtype=np.uint8)
cv2.imshow('image', img)

while True:
    key_code = cv2.waitKey(0)  # czekaj na klawisz
    
    if key_code == 27:  # ESC
        print("Zamykam okno")
        break
    
cv2.destroyAllWindows()

2.3.3. Suwaki (trackbar) - przykład

import cv2
import numpy as np


def on_change(value):
  pass


img = np.zeros((240, 400, 3), dtype=np.uint8)
window_name = 'RGB trackbars'
cv2.namedWindow(window_name)

cv2.createTrackbar('R', window_name, 0, 255, on_change)
cv2.createTrackbar('G', window_name, 0, 255, on_change)
cv2.createTrackbar('B', window_name, 0, 255, on_change)

while True:
  r = cv2.getTrackbarPos('R', window_name)
  g = cv2.getTrackbarPos('G', window_name)
  b = cv2.getTrackbarPos('B', window_name)

  img[:] = [b, g, r]
  cv2.imshow(window_name, img)

  if cv2.waitKey(10) == 27:
    break

cv2.destroyAllWindows()

UWAGA Trackbar musi być przypięty do istniejącego okna. Dlatego najpierw wywołaj cv2.namedWindow(...), a dopiero później cv2.createTrackbar(...).

3. Zadania do samodzielnego wykonania

Każde zadanie wykonaj w osobnym pliku Python (zad1.py, zad2.py, …).

💥 Zadanie 1 - Wczytanie i wyświetlenie obrazu 💥

  1. Wczytaj obraz z pliku do zmiennej img.

  2. Sprawdź, czy obraz został poprawnie wczytany (np. za pomocą warunku img is not None).

  3. Sprawdź rozmiar obrazu (img.shape), typ danych (img.dtype) i wypisz je w konsoli.

  4. Wyświetl obraz w oknie Oryginal korzystając z cv2.imshow(...).

  5. Zamknij okno po naciśnięciu dowolnego klawisza.

💥 Zadanie 2 - Zapis obrazu 💥

  1. Wczytaj obraz jak w Zadaniu 1.

  2. Zapisz kopię pod nazwą output_copy.jpg.

  3. Dodaj komunikat o błędzie, jeśli zapis się nie powiedzie (funkcja cv2.imwrite(...) zwraca True lub False).

💥 Zadanie 3 - Obsługa klawiatury 💥

  1. Odczytywanie obrazu z kamery możesz zrealizować za pomocą poniższego kodu:
import cv2

cap = cv2.VideoCapture(0)  # 0 to domyślna kamera

while True:
    ret, frame = cap.read()
    if not ret:
        print("Nie można odczytać klatki z kamery")
        break

    cv2.imshow('Kamera', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        # naciśnięcie 'q' kończy pętlę
        break

cv2.destroyAllWindows()
  1. Zmodyfikuj powyższy kod tak, aby po naciśnięciu klawisza s zapisywał aktualną klatkę do pliku snapshot.jpg.

💥 Zadanie 4 - Obsługa myszy 💥

  1. Ustaw cv2.setMouseCallback(...) dla okna z obrazem.

  2. Po kliknięciu lewym przyciskiem:

💥 Zadanie 5 - Suwaki do regulacji parametrów 💥

  1. Utwórz okno z suwakami R, G, B (zakres 0-255).

  2. Generuj obraz jednolitego koloru na podstawie pozycji suwaków.

  3. Dodaj suwak ON/OFF: